// LennardJones.cpp: archivo de proyecto principal.

#include <complex>
#include <fstream>
#include <iostream>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<time.h>


using namespace std;


#define kB 8.314e-03
#define pi 3.1415926535898
#define avogadro 602.205

template<typename T>inline T SQR(T x)
	{  return(x*x);  }
template<typename T>inline T POW3(T x)
	{  return(x*x*x);  }

template<typename T>inline T VLENGTH3(const T *x)
	{  return(sqrt(SQR(x[0])+SQR(x[1])+SQR(x[2])));  }

template<typename T>inline int anint(T x)
	{  return(int(floor(x+0.5)));  }


#include "utils.h"
#include "particulas.h"
#include "caja.h"
#include "interaccion.h"
#include "values.h"


int main(void)
{
	//double Temp=0.1;
	double Temp=3.0;
	double Etotal;
	double porcentaje;

	///Reanudar simulacion anterior
	bool restart = false;
	//Impresion de valores energia/presion/temperatura en pantalla
	bool printScreen = false;
	///Caja de la simulacion
	caja *box;

	

	//srand (time(NULL));
	//Cargamos el archivo de configuracion
	parametros param;
	param.importConfig();
	param.printConfig();

	//Archivo de salida de la energia
	ofstream MiArchivo (param.resFile,ios::out|ios::app);
	MiArchivo.precision(5);

	char name[50], name2[50];
	sprintf(name,"%s%s",param.confFile,".xyz");
	//Lo borramos si existe
	ofstream finput (name,ios::out);
	finput.close();
	sprintf(name2,"%s",param.resFile);
	//Lo borramos si existe
	ofstream finput1 (name2,ios::out);
	finput1.close();

	box = new caja(param);

	box->printXYZfile(param.confFile);
	//box->listaVecinos();
	box->linkCell();
	//box->calcEnergia();
	energiaLinkCellList(box);

	/*double ss=0.;
	for (int i=0;i<param.npart;i++)
	{
		if(box->part[i].energia!=0.)
		{
			cout<<i<<" "<<box->part[i].energia<<endl;
			ss+=box->part[i].energia;
		}
	}
	cout<<box->epoten<<" "<<ss/box->npart<<endl;*/
	box->nacc=0;
	box->printConfig(param.confFile);

	int npaso=0;
	while(true)
	{
		//box->testLinkCell();
		box->nacc=npaso;
		box->randomMovement();

		double ss=0.;
		int save=100;

		if(npaso%save==0)
		{
			cout<<"Salvando paso "<<npaso<<endl;
			porcentaje = box->nok/box->ntry;
			/*if(porcentaje<0.4)
			{
				delta*=0.99;
			}
			if(porcentaje>0.8)
			{
				delta+=1.01;
			}*/
			cout<<"Porcentaje de aceptacion: "<<100.0*porcentaje<<" % (delta: "<<param.Dr<<")"<<endl;
			energiaLinkCellList(box);
			cout<<"Etotal: "<<box->epoten<<endl;
			if (MiArchivo.is_open())
			{
				MiArchivo<<npaso<<setw(30)<<box->epoten<<endl;
			}
			box->printXYZfile(param.confFile);
			box->printConfig(param.confFile);

		}
		npaso++;
	}

	delete box;
	cout<<"sacabo"<<endl;
	system("PAUSE");
	return EXIT_SUCCESS;
}
